package com.ada.spark.rddoperator

import org.apache.spark.{SparkConf, SparkContext}

/**
  * 在一个(K,V)的RDD上调用，返回一个(K,V)的RDD，使用指定的reduce函数，将相同key的值聚合到一起，reduce任务的个数可以通过第二个可选的参数来设置。
  */
object Spark21_reduceByKey {

    def main(args: Array[String]): Unit = {
        //创建SparkConf
        val conf = new SparkConf().setAppName("Spark21_reduceByKey").setMaster("local[*]")
        //创建Spark上下文对象
        val sc = new SparkContext(conf)

        val words = Array("one", "two", "two", "three", "three", "three")

        val wordPairsRDD = sc.parallelize(words).map(word => (word, 1))

        //在一个(K,V)的RDD上调用，返回一个(K,V)的RDD，使用指定的reduce函数，将相同key的值聚合到一起，reduce任务的个数可以通过第二个可选的参数来设置。
        //reduceByKey(func, [numTasks])
        //reduceByKey在shuffle之前有combine（预聚合）操作，性能要比groupByKey好，建议使用
        val reduceByKeyRDD = wordPairsRDD.reduceByKey(_ + _)

        println(reduceByKeyRDD.collect().mkString(","))
        //(two,2),(one,1),(three,3)
    }

    /**
      * reduceByKey和groupByKey的区别
      * 1、reduceByKey：按照key进行聚合，在shuffle之前有combine（预聚合）操作，返回结果是RDD[k,v].
      * 2、groupByKey：按照key进行分组，直接进行shuffle。
      * 3、开发指导：reduceByKey比groupByKey性能好，建议使用。但是需要注意是否会影响业务逻辑。
      */

}
